树莓派GPIO控制
一、常用开源工程简介
树莓派内核中已经编译自带了gpio的驱动,我们常通过一些第三方写好的库函数来完成具体的操作,比较常见的操作库函数有:
1、python GPIO
【开发语言】——python
【简单介绍】——树莓派官方资料中推荐且容易上手。python GPIO是一个小型的python库,可以帮助用户完成raspberry相关IO口操作,但是python GPIO库还没有支持SPI、I2C或者1-wire等总线接口。
【官方网站】——
2、wiringPi
【开发语言】——C语言
【简单介绍】——wiringPi适合那些具有C语言基础,在接触树莓派之前已经接触过单片机或者嵌入式开发的人群。wiringPi的API函数和arduino非常相似,这也使得它广受欢迎。作者给出了大量的说明和示例代码,这些示例代码也包括UART设备,I2C设备和SPI设备等。
【官方网站】——
3、BCM2835 C Library
【开发语言】——C语言
【简单介绍】BCM2835 C Library可以理解为使用C语言实现的相关底层驱动,BCM2835 C Library的驱动库包括GPIO、SPI和UART等,可以通过学习BCM2835 C Library熟悉BCM2835相关的寄存器操作。如果有机会开发树莓派上的linux驱动,或自主开发python或PHP扩展驱动,可以从BCM2835 C Library找到不少的“灵感”。
【官方网站】—— 二、树莓派GPIO编号方式
1、功能物理引脚:**
从左到右,从上到下:左边基数,右边偶数:1-40
2、BCM:
编号侧重CPU寄存器,根据BCM2835的GPIO寄存器编号。
3、wpi:
编号侧重实现逻辑,把扩展GPIO端口从0开始编号,这种编号方便编程。正如图3 WiringPi一栏。
三、python GPIO
1、先安装python-dev,输入以下指令。
sudo apt-get install python-dev
**
**
2、安装RPi.GPIO,依次输入以下指令。
1下载:$ wget http://raspberry-gpio-python.googlecode.com/files/RPi.GPIO-0.5.3a.tar.gz
2解压缩:$ tar xvzf RPi.GPIO-0.5.3a.tar.gz
3进入解压之后的目录 :$ cd RPi.GPIO-0.5.3a 4启动安装 :$ sudo python setup.py install
3、例子:
1. \# -\*- coding: utf-8 -\*-
2. **import** RPi.GPIO as GPIO
3. **import** time
4. \# BOARD编号方式,基于插座引脚编号
5. GPIO.setmode(GPIO.BOARD)
6. \# 输出模式
7. GPIO.setup(11, GPIO.OUT)
8.
9. **while** True:
10. GPIO.output(11, GPIO.HIGH)
11. time.sleep(1)
12. GPIO.output(11, GPIO.LOW)
13. time.sleep(1)
4、执行: sudo python led.py
5、说明: 1)GPIO.setmode(GPIO.BOARD),采用插座引脚编号方式。 2)由于采用插座引脚编号方式,此处的11脚相当于BCM2835寄存器编号方式的引脚11。
四、python GPIO 1、说明: WiringPi是应用于树莓派平台的GPIO控制库函数,WiringPi遵守GUN Lv3。wiringPi使用C或者C++开发并且可以被其他语言包转,例如python、ruby或者PHP等。 wiringPi包括一套gpio控制命令,使用gpio命令可以控制树莓派GPIO管脚。用户可以利用gpio命令通过shell脚本控制或查询GPIO管脚。wiringPi是可以扩展的,可以利用wiringPi的内部模块扩展模拟量输入芯片,可以使用MCP23x17/MCP23x08(I2C 或者SPI)扩展GPIO接口。另外可通过树莓派上的串口和Atmega(例如arduino等)扩展更多的GPIO功能。另外,用户可以自己编写扩展模块并把自定义的扩展模块集成到wiringPi中。WiringPi支持模拟量的读取和设置功能,不过在树莓派上并没有模拟量设备。但是使用WiringPi中的软件模块却可以轻松地应用AD或DA芯片。
2.wiringPi安装
1方案A——使用GIT工具
通过GIT获得wiringPi的源代码
git clone git://git.drogon.net/wiringPi cd wiringPi
./build
build脚本会帮助你编译和安装wiringPi
2方案B——直接下载 我们可以在https://git.drogon.net/?p=wiringPi;a=summary网站上直接下载最新版本编译使用
tar xfz wiringPi-xx.tar.gz
cd wiringPi-xx
./build
3、测试:
wiringPi包括一套gpio命令,使用gpio命令可以控制树莓派上的各种接口,通过以下指令可以测试wiringPi是否安装成功。 $gpio -v gpio readall 即可出现上面的io图
4、例子:
1. \#include \<wiringPi.h\>
2. **int** main(**void**)
3. {
4. wiringPiSetup() ;
5. pinMode (0, OUTPUT) ;
6. **for**(;;)
7. {
8. digitalWrite(0, HIGH) ; delay (500) ;
9. digitalWrite(0, LOW) ; delay (500) ;
10. }
11. }
**5、编译运行:**
在树莓派上:
gcc -Wall -o test test.c -lwiringPi
sudo ./test
在虚拟机中:
am-linux-gcc -Wall -o test test.c -lwiringPi
sudo ./test
6、注意事项: 1)IO的编号方式略有不同,采用wiring编码方式。 2)-lwiringPi表示动态加载wiringPi共享库。
五、BCM2835 C Library
1、下载: $ wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.35.tar.gz
2、解压缩: $tar xvzf bcm2835-1.35.tar.gz 3、进入压缩之后的目录:$cd bcm2835-1.35 4、 配置: $./configure 5、从源代码生成安装包:$make 6、执行检查: $sudo make check 7、安装 bcm2835库: $sudo make install
8、例子
1. \#include \<bcm2835.h\>
2.
3. // P1插座第11脚
4. \#define PIN RPI\_GPIO\_P1\_11
5.
6. **int** main(**int** argc, **char** \*\*argv)
7. {
8. **if** (!bcm2835\_init())
9. **return** 1;
10.
11. // 输出方式
12. bcm2835\_gpio\_fsel(PIN, BCM2835\_GPIO\_FSEL\_OUTP);
13.
14. **while** (1)
15. {
16. bcm2835\_gpio\_write(PIN, HIGH);
17. bcm2835\_delay(100);
18.
19. bcm2835\_gpio\_write(PIN, LOW);
20. bcm2835\_delay(100);
21. }
22. bcm2835\_close();
23. **return** 0;
24. }
9、注意事项: 1)IO的编号方式略有不同,采用wiring编码方式。 2)-lwiringPi表示动态加载wiringPi共享库。**
[树莓派开发系列教程10——树莓派spi液晶屏支持(fbtft)](http://blog.csdn.net/xdw1985829/article/details/39583239)** ****树莓派官方支持****av****及****HDMI****输出,板子上预留了一个****csi****接口的液晶显示屏,但是一直没有相应的模组出现。在很多应用场合我们需要一些小型的液晶屏显示一些基本的信息,所以小屏驱动很是必要。****
**** ****在****github****上有一个开源工程:****notro/fbtft****,完整的实现了****framebuffer****驱动,让树莓派完美支持****tft****液晶,下面对移植过程进行一个简单说明****
****一、官网地址****
****工程首页:****https://github.com/notro****
****fbtft****源码:****https://github.com/notro/fbtft****
****编译好的固件(基于****3.12.25+****)****:https://github.com/notro/rpi-firmware****
****使用说明****(wiki)****:****https://github.com/notro/fbtft/wiki**
**二、使用编译好的固件****(3.12.25+)**
环境: 树莓派
https://github.com/notro/rpi-firmware
**1****、打开****SPI**
树莓派默认spi是关掉的,我们需要打开
sudo vi /etc/modprobe.d/raspi-blacklist.conf
把下面这句话前面的\#号删掉
blacklist spi-bcm2708
**2****、下载:**
1)以模块的形式编译进内核(需要手动或脚本加载模块)3.12.25+(**试验 成功**)
sudo REPO\_URI=https://github.com/notro/rpi-firmware rpi-update
2)直接编译进内核(**笔者没有试验**)
sudo REPO\_URI=https://github.com/notro/rpi-firmware BRANCH=builtin rpi-update
3)以模块的形式编译进内核(**需要手动或脚本加载模块,最新版本,笔者试过启动不起来,不知道哪出问题**)
sudo REPO\_URI=https://github.com/notro/rpi-firmware BRANCH=latest rpi-update
4)直接下载压缩包,手动安装(**适合树莓派不能联网的时候**)
http://tronnes.org/downloads/2014-06-20-wheezy-raspbian-2014-07-25-fbtft-master-firmware.zip
**3****、配置**
**1)****手动加载模块:**
sudo modprobe fbtft\_device name=adafruit22
name后面的名字,要跟相应的液晶驱动芯片移植
笔者使用的液晶芯片为:**fb\_ra8875****,所以这里写的是:****er\_tftm050\_2**
其它芯片请查阅:https://github.com/notro/fbtft/blob/master/fbtft\_device.c 文件
正常会提示以下信息
fbtft\_device: SPI devices registered:
fbtft\_device: spidev spi0.0 500kHz 8 bits mode=0x00
fbtft\_device: spidev spi0.1 500kHz 8 bits mode=0x00
fbtft\_device: 'fb' Platform devices registered:
fbtft\_device: bcm2708\_fb id=-1 pdata? no
fbtft\_device: Deleting spi0.0
fbtft\_device: GPIOS used by 'adafruit22':
fbtft\_device: 'reset' = GPIO25
fbtft\_device: 'led' = GPIO23
fbtft\_device: SPI devices registered:
fbtft\_device: spidev spi0.1 500kHz 8 bits mode=0x00
fbtft\_device: fb\_hx8340bn spi0.0 32000kHz 8 bits mode=0x00
graphics fb1: fb\_hx8340bn frame buffer, 176x220, 75 KiB video memory, 16 KiB buffer memory, fps=20, spi0.0 at 32 MHz
**在****/dev/****目录下出现****: /dev/fb1****设备**
**2****)自动加载模块**
sudo vi /etc/modules
加入以下语句,既可以在启动时自动加载模块
spi-bcm2708
fbtft\_device name=er\_tftm050\_2 **speed=28000000 fps=25** verbose=0
红色部分根据实际情况调整,可能出现花屏现象
**4****、使用(官方给出的方法,笔者测试不成功)**
**1)****手动启动****x11****和控制台到新 的液晶屏**
X Windows显示在fb1上:
$FRAMEBUFFER=/dev/fb1 startx
Console显示在fb1上:
$con2fbmap 1 1
**2)****自动登陆****x11**
**sudo vi /etc/inittab**
\#1:2345:respawn:/sbin/getty --noclear 38400 tty1
1:2345:respawn:/bin/login -f pi tty1 \</dev/tty1 \>/dev/tty1 2\>&1
**sudo vi /etc/rc.local**
su -l pi -c "env FRAMEBUFFER=/dev/fb1 startx &"
**
****5****、使用(笔者使用这个测试通过)**
**1)****将****fb0****上的内容直接拷贝到****fb1****上****,fb0****和****fb1****同步**
**https://github.com/notro/fbtft/wiki/Framebuffer-use\#framebuffer-mirroring**
$git clone https://github.com/tasanakorn/rpi-fbcp
$cd rpi-fbcp/
$mkdir build
$cd build/
$cmake ..
$make
$sudo install fbcp /usr/local/bin/fbcp
**启动**:fbcp &
**关闭****fbcp**:killall fbcp
**2)****启动时使用****fb1**
$sudo apt-get install xserver-xorg-video-fbdev
$sudo vi /usr/share/X11/xorg.conf.d/99-fbdev.conf
加入以下语句:
Section "Device"
Identifier "myfb"
Driver "fbdev"
Option "fbdev" "/dev/fb1"
EndSection
**启动:**startx
**测试:**
apt-get -y install fbi
fbi -d /dev/fb1 -T 1 -noverbose -a test.jpg
**三、由内核及源码编译**
**1****、下载、编译内核源码:**
**请见《**[**树莓派开发系列教程****8——****树莓派内核编译与固件升级**](http://blog.csdn.net/xdw1985829/article/details/39077611)**》**
**2****、下载、编译****fbtft****源码**
**$cd linux****(****进入下载好的内核源码目录****)**
**$cd drivers/video**
**$git clone https://github.com/notro/fbtft.git****(下载****fbtft****源码,也可以在别的地方下载好,拷贝过来)**
**
** ****修改内核源码的****Kconfig****及****Makefine**
** Add to drivers/video/Kconfig: source "drivers/video/fbtft/Kconfig"**
** Add to drivers/video/Makefile: obj-y += fbtft/**
**$make menuconfig(****在配置界面加入所选 用液晶的驱动支持****)**
**[plain]** [view plain](http://blog.csdn.net/xdw1985829/article/details/39583239 "view plain")[copy](http://blog.csdn.net/xdw1985829/article/details/39583239 "copy")
1. Device Drivers ---\>
2. Graphics support ---\>
3. \<M\> Support for small TFT LCD display modules ---\>
4.
5. \<M\> FB driver for the HX8353D LCD Controller
6. \<M\> FB driver for the ILI9320 LCD Controller
7. \<M\> FB driver for the ILI9325 LCD Controller
8. \<M\> FB driver for the ILI9340 LCD Controller
9. \<M\> FB driver for the ILI9341 LCD Controller
10. \< \> FB driver for the ILI9481 LCD Controller
11. \<M\> FB driver for the ILI9486 LCD Controller
12. \<M\> FB driver for the PCD8544 LCD Controller
13. \<M\> FB driver for the RA8875 LCD Controller
$make